﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace AlgorithmTest
{
    // T_[四个数字排序]_[算法名]
    public class T_0092_WordBreak : IAlgorithm
    {
        // 139. 单词拆分

        // 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。

        // 注意：不要求字典中出现的单词全部都使用，并且字典中的单词可以重复使用。

        // 提示：
        //  1 <= s.length <= 300
        //  1 <= wordDict.length <= 1000
        //  1 <= wordDict[i].length <= 20
        //  s 和 wordDict[i] 仅有小写英文字母组成
        //  wordDict 中的所有字符串 互不相同


        public void Test()
        {
            // 算法参数定义
            string s = "leetcode";
            List<string> wordDict = new List<string> { "le", "leet", "code" };
            // 算法执行与打印
            Console.WriteLine(WordBreak(s, wordDict));
        }

        // 算法
        public bool WordBreak(string s, IList<string> wordDict)
        {
            var wordDictSet = new HashSet<string>(wordDict);
            var dp = new bool[s.Length + 1];
            dp[0] = true;
            for (int i = 1; i <= s.Length; i++)
                for (int j = 0; j < i; j++)
                    if (dp[j] && wordDictSet.Contains(s[j..i]))
                    {
                        dp[i] = true;
                        break;
                    }
            return dp[s.Length];
        }
    }
}
